[算法系列]-反转字符串

序言

为了更好地提高学习效率,这几天调整了学习计划,决定把学习时间分段进行不同知识的并行学习,效果还是十分明显的。。。这几天也会和大家分享一下有关于Javascript算法的学习心得,,今天和大家分享的是有关于字符串的反转,看见大漠老师有相关知识的总结,所以偷一下懒了啦~~借鉴一下,,我进行了相关的调整,如果想要观看原文,请点击这里

问题描述

将一个字符串进行反转,如”Hello World!”进行反转,结果为”!droW olleH”。

基本方法

我想大家如果看见这个算法题目,首先想到的应该是使用字符串和数组的内置函数:

  • String.prototype.split()
  • Array.prototype.reverse()
  • Array.prototype.join()

其中:

  • split() - 拆分字符串的每个字符,并将其当做数组的每个元素
  • reverse() - 进行数组元素的反转
  • join() - 将数组 的每个元素按照一定的规则进行连接,使其成为一个新的字符串

下面让我们使用这三种方法实现上述的算法题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function reverseString(str) {
// 第一步,使用split()方法,返回一个新数组
// var splitString = "hello".split("");

var splitString = str.split(""); //将字符串拆分

// 返回一个新数组["h", "e", "l", "l", "o"]

// 第二步,使用reverse()方法创建一个新数组
// var reverseArray = ["h", "e", "l", "l", "o"].reverse();

var reverseArray = splitString.reverse();
// 原数组元素顺序反转["o", "l", "l", "e", "h"]

// 第三步,使用join()方法将数组的每个元素连接在一起,组合成一个新字符串
// var joinArray = ["o", "l", "l", "e", "h"].join("");

var joinArray = reverseArray.join("");
// "olleh"

// 第四步,返回一个反转的新字符串
return joinArray; // "olleh"
}

reverseString("hello"); // => olleh

简化之

1
2
3
4
function reverseString(str) {
return str.split("").reverse().join("");
}
reverseString("hello"); // => olleh

使用循环遍历反转字符串

我们也可以使用循环遍历实现字符串的反转,思路为:创建一个空字符串,将原始字符串进行循环递减遍历,将其每一个字符添加到新字符串上面,如:

1
2
3
4
5
6
7
8
9
10
function reverseString(str) {
var newString = "";

for (var i = str.length - 1; i >= 0; i--) {
newString += str[i]; // 或者 newString = newString + str[i];
}

return newString;
}
reverseString('hello'); // => // "olleh"

使用while循环语句的的话为:

1
2
3
4
5
6
7
8
9
10
11
function reverseString (str) {
var newString = '';
var i = str.length;

while (i > 0) {
newString += str.substring(i - 1, i);
i--;
}
return newString;
}
reverseString("hello"); // => olleh

注: 其中substring()方法返回字符串两个索引之间的子串。

使用递归算法

首先我先讲一下使用到的两个方法:

  • charAt() - 以单字符字符串的形式返回给定位置的那个字符。
  • sunstr() - 返回被操作字符串的一个子字符串,可以接收一个或者两个参数。第一个参数指定子字符串的开始位置,第二个参数(指定的情况下)表示返回子字符串的字符个数。若 没有传递第二个参数,则将字符串的长度作为结束位置。若 传递的参数为负值,则将负的第一个参数加上字符串的长度.第二个负的参数转换为0。

算法实现为:

1
2
3
4
5
6
7
8
function reverseString(str) {
if (str === "") {
return "";
} else {
return reverseString(str.substr(1)) + str.charAt(0);
}
}
reverseString("hello"); // => olleh

注: 这个递归算法看起来有点困难,我也是捉摸了一小会儿才搞明白,,大家还是看看大漠老师原文里面的讲解吧,,有助于你的理解奥~~ 点击这里

三元操作符简化之:

1
2
3
4
function reverseString(str) {
return (str === '') ? '' : reverseString(str.substr(1)) + str.charAt(0);
}
reverseString("hello"); // => olleh

1
2
3
4
function reverseString(str) {
return str && reverseString(str.substr(1)) + str[0];
}
reverseString("hello"); // => olleh

总结

还有一些方法可以实现,但是我想先讲解这三种比较简单的实现方法,,希望大家会喜欢呀 ~~ 希望可以帮助到大家 ~~

对了,,记得自己动手实践一下下奥~~~